package com.xsb.aspectj.aspect;

import android.util.Log;
import com.xsb.aspectj.annotation.ClickBehavior;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

/**
 * author : 薛少博
 * e-mail : xsb@zlhopesun.com
 * time   : 2021/6/15
 * desc   : 定义切面类
 */
@Aspect
public class ClickBehaviorAspect { 
  private final static String TAG = "MainActivity";

  // * *(..)处理ClickBehavior类所有的方法
  //execution 以方法执行时作为切入点
  @Pointcut("execution(@com.xsb.aspectj.annotation.ClickBehavior * *(..))")
  public void methodPointCut(){}

  //对切入点如何处理
  @Around("methodPointCut()")
  public Object joinPoint(ProceedingJoinPoint joinPoint) throws  Throwable{
    //获取签名方法
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    //获取类名
    String className = signature.getDeclaringType().getSimpleName();
    //获取方法名
    String methodName = signature.getName();
    //获取方法注解值
    String value = signature.getMethod().getAnnotation(ClickBehavior.class).value();
    //统计方法的执行时间、统计用户点击某功能行为（存储本地数据库，或者上传到后台服务器）
    long begin = System.currentTimeMillis();
    Log.e(TAG, "ClickBehavior Method start >>> ");
    Object result = joinPoint.proceed();
    long duration = System.currentTimeMillis() - begin;
    Log.e(TAG, "ClickBehavior Method end >>> ");
    Log.e(TAG, String.format("统计了：%s功能，在%s类的%s方法，用时%d ms",
        value,className,methodName,duration));
    return result;
  }
}
